-
Notifications
You must be signed in to change notification settings - Fork 13.6k
Use tcx.short_string()
in more diagnostics
#144039
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
r? @fee1-dead rustbot has assigned @fee1-dead. Use |
HIR ty lowering was modified cc @fmease |
// FIXME(estebank): diagnostics with long type paths that don't print out the full path anywhere | ||
// still prints the note explaining where the type was written to. | ||
//@ compile-flags: -Zwrite-long-types-to-disk=yes |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I found these by changing the default -Zwrite-long-types-to-disk=no
in compiletest::runtest::TestCx::make_compile_args
to yes
, which highlighted some preexisting cases that I'll investigate.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One left: tests/ui/methods/filter-relevant-fn-bounds.rs
. Also pre-existing.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
compiler/rustc_trait_selection/src/error_reporting/traits/fulfillment_errors.rs
Outdated
Show resolved
Hide resolved
let ty_str = tcx.short_string(ty, err.long_ty_path()); | ||
let msg = format!("required because it appears within the type `{ty_str}`"); | ||
let mut msg = || { | ||
let ty_str = tcx.short_string(ty, err.long_ty_path()); | ||
format!("required because it appears within the type `{ty_str}`") | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This probably illustrates a problem we have with the current system: we don't prevent if a short string was created but was never printed. I think there could be a mechanism (a drop guard for a custom short_string
return newtype) in which we detect that. Could you open an issue?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These ui tests are now regressions because we should not "show generic arguments when the method can't be found in any implementations". If you're trying to prevent us from creating a short string when we don't use it, maybe we should pass a closure down instead of the ty_str_reported
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think that I originally made the message only mention the item name instead of the Ty<'_>
was precisely because we didn't have short_string
back then and we could end up with quite long output accidentally. I was concerned back then that there are cases where the method is available on a given type depending on bounds on its type parameters, so I felt comfortable relying exclusively on short_string
for keeping the output readable.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
inconsistent output in aarch64
seems quite odd. Could you explain what the issue is?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It was the error from #144039 (comment)
I suspect that that platform in particular prints a slightly different output for the closure type which puts it under the default terminal width threshold.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
that platform in particular prints a slightly different output for the closure type
That is really really surprising for me. Could you post an issue for this? This seems very worthy of investigation.
`TyCtxt::short_string` ensures that user visible type paths aren't overwhelming on the terminal output, and properly saves the long name to disk as a side-channel. We already use these throughout the compiler and have been using them as needed when users find cases where the output is verbose. This is a proactive search of some cases to use `short_string`. We add support for shortening the path of "trait path only". Every manual use of `short_string` is a bright marker that that error should be using structured diagnostics instead (as they have proper handling of long types without the maintainer having to think abou tthem).
When we don't actually print out a shortened type we don't need the "use `--verbose`" note.
This test seems to have improper use of `TyCtxt::short_string`.
TyCtxt::short_string
ensures that user visible type paths aren't overwhelming on the terminal output, and properly saves the long name to disk as a side-channel. We already use these throughout the compiler and have been using them as needed when users find cases where the output is verbose. This is a proactive search of some cases to useshort_string
.We add support for shortening the path of "trait path only".
Every manual use of
short_string
is a bright marker that that error should be using structured diagnostics instead (as they have proper handling of long types without the maintainer having to think abou tthem).